package com.heima.comment.service.impl;

import com.heima.comment.service.CommentRepayService;
import com.heima.common.exception.CustException;
import com.heima.feigns.UserFeign;
import com.heima.model.comment.dtos.CommentRepayDTO;
import com.heima.model.comment.dtos.CommentRepayLikeDTO;
import com.heima.model.comment.dtos.CommentRepaySaveDTO;
import com.heima.model.comment.pojos.ApComment;
import com.heima.model.comment.pojos.ApCommentLike;
import com.heima.model.comment.pojos.ApCommentRepay;
import com.heima.model.comment.pojos.ApCommentRepayLike;
import com.heima.model.comment.vos.ApCommentRepayVO;
import com.heima.model.comment.vos.CommentLikeVo;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.threadlocal.AppThreadLocalUtils;
import com.heima.model.user.pojos.ApUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.CriteriaExtensionsKt;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @作者 Azer
 * @创建日期 2021/11/29 15:04
 **/
@Service
@Slf4j
public class CommentRepayServiceImpl implements CommentRepayService {

    @Autowired
    MongoTemplate mongoTemplate;

    @Autowired
    UserFeign userFeign;

    /**
     * 查看更多回复内容 加载回复列表
     * @param dto
     * @return
     */
    @Override
    public ResponseResult loadCommentRepay(CommentRepayDTO dto) {
//        1. 校验参数
//
//        评论id不能为空  size为null 或 0 设置为10  最小日期为空 设置为当前
        dto.checkParam();

        if(dto.getMinDate()==null){
            dto.setMinDate(new Date());
        }
//
//        2. 条件查询评论回复信息
//
//​	条件:  commentId = 评论id and createdTime 小于 minDate  创建时间 降序  limit size
        Query query = Query.query(Criteria.where("commentId").is(dto.getCommentId())
                .and("createdTime").lt(dto.getMinDate()))
                .limit(dto.getSize())
                .with(Sort.by(Sort.Direction.DESC, "createdTime"));

        List<ApCommentRepay> commentRepayList = mongoTemplate.find(query, ApCommentRepay.class);

//
//        3. 检查是否登录
        ApUser apUser = AppThreadLocalUtils.getUser();
        if(apUser==null){
            //​	3.1 如果未登录直接 返回评论回复列表
            return ResponseResult.okResult(commentRepayList);
        }
//

//
//​	3.2 如果登录，需要判断哪些回复点过赞
//
//​	思路:
//
//​	     基于当前列表 回复id集合  及  登录人id 查询回复点赞列表
//
//​	     遍历 当前回复列表，将每一个回复信息 封装成 vo
//
//​	     判断当前回复id 在点赞信息中是否存在，如果存在 operation设置为0 不存在不做处理

        List<ApCommentRepay> commentRepayListVo=new ArrayList<>();
        c:
        for (ApCommentRepay commentRepay : commentRepayList) {
            ApCommentRepayVO apCommentRepayVO=new ApCommentRepayVO();
            BeanUtils.copyProperties(commentRepay,apCommentRepayVO);
            Query query1 = Query.query(Criteria.where("authorId").is(apUser.getId()).and("commentRepayId").is(commentRepay.getId()));
            ApCommentRepayLike one = mongoTemplate.findOne(query1, ApCommentRepayLike.class);
            if(one!=null){
                apCommentRepayVO.setOperation((short)0);
                commentRepayListVo.add(apCommentRepayVO);
                continue c;
            }
            commentRepayListVo.add(apCommentRepayVO);

        }
        return ResponseResult.okResult(commentRepayListVo);
    }

    /**
     * 保存回复
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveCommentRepay(CommentRepaySaveDTO dto) {
        ApCommentRepay apCommentRepay=new ApCommentRepay();
//        1. 参数校验:
//
//        是否登录  评论id是否为空  内容是否为空  内容是否大于140个字符
        ApUser apUser = AppThreadLocalUtils.getUser();
        if(apUser==null){
            CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
        }
//
//        回复内容安全校验
//
//  ​     简单: 不校验      普通: 阿里云内容检查，有问题抛异常     困难：阿里云内容检查，有问题替换为**
//
        ResponseResult<ApUser> userById = userFeign.findUserById(apUser.getId());
        ApUser user = userById.getData();
//        2. 根据评论id查询评论信息  检查是否存在
        //        3. 保存评论回复信息
//
//        4. 修改评论信息中回复数量 + 1
        Query query = Query.query(Criteria.where("commentId").is(dto.getCommentId()).and("authorId").is(apUser.getId()));
        List<ApCommentRepay> commentRepayList = mongoTemplate.find(query, ApCommentRepay.class);
        if(CollectionUtils.isEmpty(commentRepayList)){


            apCommentRepay.setAuthorId(apUser.getId());
            apCommentRepay.setAuthorName(user.getName());
            apCommentRepay.setCommentId(dto.getCommentId());
            apCommentRepay.setContent(dto.getContent());
            apCommentRepay.setLikes(0);
//            apCommentRepay.setLongitude();
//            apCommentRepay.setLatitude();
//            apCommentRepay.setAddress();
            apCommentRepay.setCreatedTime(new Date());
            apCommentRepay.setUpdatedTime(new Date());
            mongoTemplate.save(apCommentRepay);

            Query id = Query.query(Criteria.where("id").is(dto.getCommentId()));
            ApComment one = mongoTemplate.findOne(id, ApComment.class);
            one.setReply(one.getReply()+1);
            mongoTemplate.save(one);
            log.info("保存评论回复初始化成功");
            return ResponseResult.okResult();

        }else {
            apCommentRepay.setAuthorId(apUser.getId());
            apCommentRepay.setAuthorName(user.getName());
            apCommentRepay.setCommentId(dto.getCommentId());
            apCommentRepay.setContent(dto.getContent());
            apCommentRepay.setLikes(0);
//            apCommentRepay.setLongitude();
//            apCommentRepay.setLatitude();
//            apCommentRepay.setAddress();
            apCommentRepay.setCreatedTime(new Date());
            apCommentRepay.setUpdatedTime(new Date());
            mongoTemplate.save(apCommentRepay);

            Query id = Query.query(Criteria.where("id").is(dto.getCommentId()));
            ApComment one = mongoTemplate.findOne(id, ApComment.class);
            one.setReply(one.getReply()+1);
            mongoTemplate.save(one);
            log.info("保存评论回复初始化成功");
            return ResponseResult.okResult();
        }


    }


    /**
     * 点赞回复的评论
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveCommentRepayLike(CommentRepayLikeDTO dto) {

//        1. 校验参数
//
//​       回复id不能为空   operation 必须 0 或 1
//
//​       校验登录  (必须登录)
        ApUser user = AppThreadLocalUtils.getUser();
        if(user==null){
            CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
        }
//
//​       校验回复信息是否存在


        Integer userId = user.getId();
//        3. 如果是点赞操作 判断是否已经点赞
        Query query = Query.query(Criteria.where("commentRepayId").is(dto.getCommentRepayId()).and("authorId").is(user.getId()));
        ApCommentRepayLike LikeOne = mongoTemplate.findOne(query, ApCommentRepayLike.class);

        if(dto.getOperation()==0 && LikeOne!=null){
//            点过赞提示 请勿重复点赞
            CustException.cust(AppHttpCodeEnum.DATA_NOT_ALLOW,"请勿重复点赞");
        }

        //查询出评论回复信息
        Query query1 = Query.query(Criteria.where("id").is(dto.getCommentRepayId()));
        ApCommentRepay commentRepayOne = mongoTemplate.findOne(query1, ApCommentRepay.class);

//        未点过赞   保存点赞信息到mongo
        if(dto.getOperation()==0 && LikeOne ==null){
            LikeOne=new ApCommentRepayLike();

            LikeOne.setAuthorId(userId);
            LikeOne.setCommentRepayId(dto.getCommentRepayId());
            LikeOne.setOperation(dto.getOperation());

            mongoTemplate.save(LikeOne);
//            并将回复信息的点赞数量字段+1

            commentRepayOne.setLikes(commentRepayOne.getLikes()+1);
            mongoTemplate.save(commentRepayOne);

            log.info("点赞成功");

        }

//

//
//        4. 如果是取消点赞操作
//
//                删除点赞信息
        if(dto.getOperation()==1){
            mongoTemplate.remove(query,ApCommentRepayLike.class);

            //        并修改评论信息的点赞数量( - 1) , 要判断下别减成负数
            if(commentRepayOne.getLikes()>0){
                commentRepayOne.setLikes(commentRepayOne.getLikes()-1);
                mongoTemplate.save(commentRepayOne);
            }

            log.info("取消点赞成功");

        }
//

//
//        5. 返回结果时，需要返回点赞点赞数量  返回的key要求必须是:  likes
        CommentLikeVo commentLikeVo=new CommentLikeVo();
        ApCommentRepay commentNow = mongoTemplate.findOne(query1, ApCommentRepay.class);
        commentLikeVo.setLikes(commentNow.getLikes());

        return  ResponseResult.okResult(commentLikeVo);

    }
}
